# -*- codeing = utf-8 -*-
# @Time : 2021/2/27 15:53
# @Atuthor: 朱朱
# @File: 135序列化和反序列化.py
# @Software: PyCharm
""
"""
通过文件操作，我们可以将字符串写入到一个本地文件。
但是，如果是一个对象(例如列表、字典、元组等)，就无法直接写入到一个文件里，
需要对这个对象进行序列化，然后才能写入到文件里。

设计一套协议，按照某种规则，把内存中的数据转换为字节序列，
保存到文件，这就是序列化，反之，从文件的字节序列恢复到内存中，就是反序列化。

Python中提供了JSON和pickle两个模块用来实现数据的序列化和反序列化

JSON模块
JSON(JavaScriptObjectNotation, JS对象简谱)是一种轻量级的数据交换格式，
它基于 ECMAScript 的一个子集，采用完全独立于编程语言的文本格式来存储和表示数据。
JSON的本质是字符串！

pickle模块
和json模块类似，pickle模块也有dump和dumps方法可以对数据进行序列化，
同时也有load和loads方法进行反序列化。
区别在于，json模块是将对象转换成为字符串，
而pickle模块是将对象转换成为二进制。

pickle模块里方法的使用和json里方法的使用大致相同，
需要注意的是，pickle是将对象转换成为二进制，
所以，如果想要把内容写入到文件里，这个文件必须要以二进制的形式打开。

区别(了解)
思考: json和pickle两个模块都可以将对象进行序列化和反序列化，
那它们有哪些区别，在使用场景上又该如何选择？

json模块:
将对象转换成为字符串，不管是在哪种操作系统，哪种编程语言里，
字符串都是可识别的。
json就是用来在不同平台间传递数据的。
并不是所有的对象都可以直接转换成为一个字符串，
下表标列出了Python对象与json字符串的对应关系。
Python	        JSON
dict	        object
list,tuple	    array
str	            string
int,float	    number
True	        true
False	        false
None	        null
如果是一个自定义对象，默认无法装换成为json字符串，
需要手动指定JSONEncoder.
如果是将一个json串重新转换成为对象，这个对象里的方法就无法使用了。
pickle模块：
pickle序列化是将对象按照一定的规则转换成为二进制保存，它不能跨平台传递数据。
pickle的序列化会将对象的所有数据都保存。
"""